package d1_midterm_examination.d1_firstquestion;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * java面向对象的语言,就要面向对象的写代码
 */
public class OkTest {
    //目标: 完成幸存者编号
    //1、由于每个囚犯是一个对象, 并且我们想要每个囚犯的编号和位置, 所以我们把囚犯定义成对象来实现这个案例会更好
    //2、创建一个100个囚犯, 依次站位(由于Set是无序的,所以不可以使用), 并为其复制编号(1-200之间的随机数)
    public static List<People> peoples = new ArrayList<>();

    public static void main(String[] args) {
        //--i;无法理解,就改成死循环


        //5、创建一个随机数对象
        Random r = new Random();

        //3、开始为每个囚犯添加编号和囚犯
        //注意囚犯的占位是从1开始
        for (int i = 1; i <= 100; i++) {
            //4、生成一个随机的编号
            int code = r.nextInt(200) + 1;
            //5、创建一个囚犯对象,用于封装编号和占位
            People people = new People();
            //6、判断编号是否已经存在(堵路功能独立成方法)----------->制定规则 如果不存在返回false 存在就返回true
            if (isNotExist(code)){
                //7、能进入到这里,证明是不存在,就往集合里面压
                people.setNumber(code);
                people.setLocation(i);
                peoples.add(people);
            }else{
                //8、如果进入到这里,就是编号已经存在
                --i;//还是为当前这个站位生成编号
            }
        }

        //9、开始展示集合
        System.out.println(peoples);
        
        //10、进行击杀占位是奇数的囚犯 --> 进行反复击杀-->直到剩下最后一个人
        while(peoples.size() > 1){
            //逆向思维, 存活的是偶数占位的囚犯
            //不可以直接删除,删除很复杂-->每次删除,后面的都会往往前补------->也不可以利用第一次的站位,进行删除
            //11、定义一个临时的集合,用于存储每一轮存活的囚犯
            List<People> luckPeople = new ArrayList<>();
            //12、站位是奇数的就压到集合里面
            for (int i = 1; i < peoples.size(); i+=2) {
                luckPeople.add(peoples.get(i));
            }
            //13、然后循化上面的步骤
            peoples = luckPeople;
        }

        //14、最后获取结果
        System.out.println(peoples.get(0));
    }

    //7、判断囚犯是否存在
    public static boolean isNotExist(int code) {
        //需要集合,所以集合的定义成静态,更加方便
        //7.1遍历集合,获取所有编号
        for (People people : peoples) {
            //7.2利用code与集合中的每一个囚犯的编号进行比较
            if (people.getNumber() == code) {
                //7.3证明是已经存在
                return false;
            }
        }
        //7.4证明是不存在
        return true;
    }
}
